package liuyang.bigeventserver.modules.security.jwt.vo;

import lombok.Data;
import lombok.ToString;

import java.util.Set;

/**
 * 注意：本类就是一个POJO不依赖Shiro环境，把Shiro取到前面只是为了强调是在编写程序时是在Shiro上下文中使用该类。
 * 改个名字应该就可以适配Spring Security环境。
 * 20210518 已经改名为PrincipalInfo，原名叫ShiroJwtPrincipalInfo
 *          是不是叫CredentialInfo更合适？但PrincipalInfo更适合Shiro的Realm环境。
 *
 * 用于在Realm的doGetAuthenticationInfo和doGetAuthorizationInfo方法之间传递认证授权信息
 * 字段名称使用Shiro环境中的术语
 * 抽象这个vo的视频，参考：[解析jwtToken和自定义JWTRealm](https://www.bilibili.com/video/BV1vE411i7ij?p=140)
 * @author liuyang
 * @since 2021/5/17
 */
@Data
@ToString
public class PrincipalInfo {
    // Shiro验证流程貌似并不关心jwt的id，但留着 <-> jwt::jti
    private String jti;            // jti
    // 业务相关的用户id
    private String id;
    // shiro::subject <-> jwt::sub
    private String subject;         // sub            username
    // shiro::roles <-> jwt::自定义payload
    private Set<String> roles;      // 角色集合         FilterChainDefinitionMap中 perms[]
    // shiro::perms <-> jwt::自定义payload
    private Set<String> perms;      // 权限集合         FilterChainDefinitionMap中 roles[]
    /**
     * 说明1：
     * 以下jwt的payload信息，Shiro并不关心
     * iss  (issure)
     * iat  (issued at)
     * exp  (expiration time)
     */
    /**
     * 说明2：关于在jwt中存储角色和权限信息的讨论
     * 可以携带，也可以不携带。
     * 可以携带的理由是：即使权限信息可以被用base64解码，但只要服务器签发令牌时候使用的secret不泄露，任何篡改token的行为都可以被识别，故看到了也没关系。好处是节省服务器权限查询次数。
     * 不携带的理由：那就是你的权限连看都看不到。代价是每个服务请求，授权服务器都需要重新检索权限信息。
     *
     * 但无论是否在jwt令牌中存放角色和权限集合，本类作为Shiro上下文中的值对象，保留roles和perms都是方便的。
     */
}
